﻿using ExcellentProjectPlus.Aplicacion.Catalogos.Catalogos;
using ExcellentProjectPlus.Aplicacion.Cuestionarios.Preguntas;
using ExcellentProjectPlus.Dominio.Cuestionarios.Entidades;
using ExcellentProjectPlus.Dominio.Cuestionarios.Servicios.CuestionarioPreguntas;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Transactions;

namespace ExcellentProjectPlus.Aplicacion.Cuestionarios.CuestionarioPreguntas
{
    public class ServicioDeGestionDeCuestionarioPreguntas
    : IServicioDeGestionDeCuestionarioPreguntas
    {
        #region Propiedades
        IServicioDeAdministracionDeCuestionarioPreguntas _servicioDeAdministracionDeCuestionarioPreguntas;
        IServicioDeGestionDePreguntas _servicioDeGestionDePreguntas;
        #endregion

        #region Constructores
        public ServicioDeGestionDeCuestionarioPreguntas(IServicioDeAdministracionDeCuestionarioPreguntas servicioDeAdministracionDeCuestionarioPreguntas,
            IServicioDeGestionDePreguntas servicioDeGestionDePreguntas)
        {
            _servicioDeAdministracionDeCuestionarioPreguntas = servicioDeAdministracionDeCuestionarioPreguntas;
            _servicioDeGestionDePreguntas = servicioDeGestionDePreguntas;
        }
        #endregion
        public List<PreguntaCuestionario> ObtenerCuestionarioPreguntas(int idCuestionario)
        {
            return _servicioDeAdministracionDeCuestionarioPreguntas.ObtenerCuestionarioPreguntas(idCuestionario);
        }
        public IEnumerable<object> ObtenerCuestionarioPreguntasConDetalle(int idCuestionario)
        {
            IEnumerable<PreguntaCuestionario> resultado = null;
            var trxOptions = new TransactionOptions();
            //Lectura con nivel de aislamiento ReadUncommited para evitar bloqueos en la base
            trxOptions.IsolationLevel = IsolationLevel.ReadUncommitted;
            trxOptions.Timeout = TimeSpan.FromMinutes(2);

            IEnumerable<Pregunta> preguntas = null;

            using (var transaccion = new TransactionScope(TransactionScopeOption.RequiresNew, trxOptions))
            {
                preguntas = _servicioDeGestionDePreguntas.ObtenerPreguntas();
                transaccion.Complete();
            }

            using (var transaccion = new TransactionScope(TransactionScopeOption.RequiresNew, trxOptions))
            {
                resultado = _servicioDeAdministracionDeCuestionarioPreguntas.ObtenerCuestionarioPreguntas(idCuestionario);
                transaccion.Complete();
            }
            return resultado.Select(p => new
                                {
                                    IdCuestionario = p.IdCuestionario,
                                    IdPregunta = p.IdPregunta,
                                    Enunciado = p.Pregunta.Enunciado,
                                    CodigoTipo = p.Pregunta.CodigoTipo,
                                    CodigoCategoria = p.Pregunta.CodigoCategoria,
                                    CodigoArea = p.Pregunta.CodigoArea,
                                    Calificacion = p.Calificacion,
                                    Estado = p.Pregunta.Estado
                                });

        }

        public PreguntaCuestionario ObtenerCuestionarioPreguntaPorId(int id)
        {
            PreguntaCuestionario resultado = null;
            var trxOptions = new TransactionOptions();
            //Lectura con nivel de aislamiento ReadUncommited para evitar bloqueos en la base
            trxOptions.IsolationLevel = IsolationLevel.ReadCommitted;
            trxOptions.Timeout = TimeSpan.FromMinutes(2);
            using (var transaccion = new TransactionScope(TransactionScopeOption.RequiresNew, trxOptions))
            {
                resultado = _servicioDeAdministracionDeCuestionarioPreguntas.ObtenerCuestionarioPreguntaPorId(id);
                transaccion.Complete();
            }

            return resultado;
        }

        public void AgregarCuestionarioPregunta(PreguntaCuestionario cuestionariopregunta)
        {
            _servicioDeAdministracionDeCuestionarioPreguntas.AgregarCuestionarioPregunta(cuestionariopregunta);
        }

        public void ModificarCuestionarioPregunta(PreguntaCuestionario cuestionariopregunta)
        {
            _servicioDeAdministracionDeCuestionarioPreguntas.ModificarCuestionarioPregunta(cuestionariopregunta);
        }

        public void EliminarCuestionarioPregunta(PreguntaCuestionario cuestionariopregunta)
        {
            _servicioDeAdministracionDeCuestionarioPreguntas.EliminarCuestionarioPregunta(cuestionariopregunta);
        }

        public void EliminarPreguntaCuestionario(int idCuestionario, int idPregunta)
        {
            _servicioDeAdministracionDeCuestionarioPreguntas.EliminarPreguntaCuestionario(idCuestionario, idPregunta);
        }
    }
}
